package com.scienzeinternazionali.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.scienzeinternazionali.application.ConnectionManager;
import com.scienzeinternazionali.dto.Insegnamento;
import com.scienzeinternazionali.exception.DataAccessException;
import com.scienzeinternazionali.exception.DataSourceException;
import com.scienzeinternazionali.exception.InsegnamentoException;
import com.scienzeinternazionali.util.LogFactory;

public class InsegnamentoDAO {

		
		  private static Logger logger = LogFactory.getLogger(LogFactory.SCIENZEINTERNAZIONALI);

		  private Statement st = null;
		  private ResultSet rs = null;
		  private Connection conn = null;
		  private PreparedStatement pstm = null;
/* da trasformare in inserisciInsegnamento
		  public void inserisciPost(Post post)throws DataAccessException, PostException{
			  logger.debug("inserisciPost IN");
			  String insert;
			  try {
				    conn = ConnectionManager.getConnection();
				    insert = "INSERT into post (data_inserimento,data_ultima_modifica,titolo,post,id_user, stato, link, top) values (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,?,?,?,?,?,?)";
					logger.debug("insert :" + insert);
					pstm = conn.prepareStatement(insert);
					pstm.setString(1, post.getTitolo());
					pstm.setString(2, post.getPost());
					pstm.setString(3, post.getId_user());
					pstm.setInt(4, post.getStato());
					pstm.setString(5, post.getLink());
					pstm.setInt(6, post.getSticky());
					pstm.executeUpdate();
					pstm.close();
					}catch (SQLException e) {
						e.printStackTrace();
						logger.fatal(e.getMessage());
						throw new PostException("errore durante inserimento del post");
					} catch (Exception e) {
						e.printStackTrace();
						logger.fatal(e.getMessage());
						throw new DataAccessException("errore generale durante inserimento del post");
					} finally {
						ConnectionManager.closeAll(rs, pstm, conn);
						logger.debug("inserisciPost OUT");
					}
		  }
*/
		  /* da aggiornare successivamente in aggiornaInsegnamento
		  public void aggiornaPost(Post post)throws DataAccessException, PostException{
			  logger.debug("aggiornaPost IN");
			  String update;
			  try {
				conn = ConnectionManager.getConnection();
				update = "UPDATE post set data_ultima_modifica = CURRENT_TIMESTAMP, titolo = ?,post = ?,id_user = ?, stato = ?, link = ?, top=? where id_post = ?";
				System.out.println(update);
				System.out.println("aggiornaPost post.getId_user() "+post.getId_user());
				System.out.println("aggiornaPost post.getStato()"+post.getStato());
				System.out.println("aggiornaPost post.getId_post()"+post.getId_post());
				System.out.println("aggiornaPost post.getLink()"+post.getLink());
			    logger.debug("update :" + update);
			    pstm = conn.prepareStatement(update);
			    pstm.setString(1, post.getTitolo());
			    pstm.setString(2, post.getPost());
			    pstm.setString(3, post.getId_user());
			    pstm.setInt(4, post.getStato());
			    pstm.setString(5, post.getLink());
			    pstm.setInt(6, post.getSticky());
			    pstm.setInt(7, post.getId_post());
			    pstm.executeUpdate();
			    pstm.close();	
			}catch (SQLException e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new PostException("errore durante l'aggiornameno del post");
			} catch (Exception e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new DataAccessException("errore generale durante l'aggiornamento del post");
			} finally {
				ConnectionManager.closeAll(rs, pstm, conn);
				logger.debug("aggiornaPost OUT");
			}
		  }
*/
		 
 


			public List<Insegnamento> getAllInsegnamenti() throws DataAccessException,InsegnamentoException{
				logger.debug("getAllInsegnamenti IN");
				List<Insegnamento> elencoInsegnamenti = new ArrayList<Insegnamento>();
				try {
			        String sql= "SELECT id_insegnamento, desc_insegnamento, programma, programma_lab, global_studies, studi_europei, diritti_umani, attivo FROM insegnamenti order by attivo desc, desc_insegnamento asc";
			        logger.debug(sql);
			        conn = ConnectionManager.getConnection();
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);
			        while (rs.next()) {
			        	Insegnamento insegnamento = new Insegnamento();
			        	insegnamento.setIdInsegnamento(rs.getInt(1));
			        	insegnamento.setDescInsegnamento(rs.getString(2));
			        	insegnamento.setProgramma(rs.getString(3));
			        	insegnamento.setProgrammaLab(rs.getString(4));
			        	insegnamento.setGlobalStudies(rs.getInt(5));
			        	insegnamento.setStudiEuropei(rs.getInt(6));
			        	insegnamento.setDirittiUmani(rs.getInt(7));
			        	if(rs.getInt(8) == 1 ){
			        	  insegnamento.setAttivo(true);
			        	}else{
			        		insegnamento.setAttivo(false);
			        	}
			        	elencoInsegnamenti.add(insegnamento);
				    }
				}catch (DataSourceException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException(e.getMessage());
				} catch (SQLException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new InsegnamentoException("errore generale durante il caricamento della lista degli insegnamenti");
				} catch (Exception e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException("errore generale durante l'accesso al DB");
				} finally {
					ConnectionManager.closeAll(rs, pstm, conn);
					logger.debug("getAllInsegnamenti OUT");
				}
				return elencoInsegnamenti;
			}
			
	}
